//: typeinfo/FamilyVsExactType.java
// The difference between instanceof and class
package typeinfo;

import static net.mindview.util.Print.*;

class Base
{
}

class Derived extends Base
{
}

public class FamilyVsExactType
{
    static void test(Object x)
    {
        print("Testing x of type " + x.getClass());
        print("x instanceof Base " + (x instanceof Base));
        print("x instanceof Derived " + (x instanceof Derived));
        print("Base.isInstance(x) " + Base.class.isInstance(x));
        print("Derived.isInstance(x) " + Derived.class.isInstance(x));
        print("x.getClass() == Base.class " + (x.getClass() == Base.class));
        print("x.getClass() == Derived.class " + (x.getClass() == Derived.class));
        print("x.getClass().equals(Base.class)) " + (x.getClass().equals(Base.class)));
        print("x.getClass().equals(Derived.class)) " + (x.getClass().equals(Derived.class)));
    }
    
    public static void main(String[] args)
    {
        test(new Base());
        System.out.println("---------------------");
        test(new Derived());
    }
} /*
   * Output: Testing x of type class typeinfo.Base x instanceof Base true x instanceof Derived false Base.isInstance(x)
   * true Derived.isInstance(x) false x.getClass() == Base.class true x.getClass() == Derived.class false
   * x.getClass().equals(Base.class)) true x.getClass().equals(Derived.class)) false Testing x of type class
   * typeinfo.Derived x instanceof Base true x instanceof Derived true Base.isInstance(x) true Derived.isInstance(x)
   * true x.getClass() == Base.class false x.getClass() == Derived.class true x.getClass().equals(Base.class)) false
   * x.getClass().equals(Derived.class)) true
   */// :~
